package com.yzh.springboot_rbac.service.impl;

import com.yzh.springboot_rbac.entity.DictData;
import com.yzh.springboot_rbac.mapper.DictDataMapper;
import com.yzh.springboot_rbac.service.DictDataService;
import com.yzh.springboot_rbac.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DictDataServiceImpl implements DictDataService {
    /**
     * 查询系列各种方法
     */

    /**
     * 1.查询字典数据通过类型：
     * -先在缓存里面查，缓存里面没有再在mysql里面查。
     */
    /**没有加缓存情况 **/
   /* @Autowired
    private DictDataMapper dictDataMapper;


    @Override
    public List<DictData> selectDictDataByType(String dictType) {
        List<DictData> dictData = dictDataMapper.selectDictDataBytype(dictType);
        return dictData;*/
    /**
     * 改造：加redis缓存
     */

    @Autowired
    private DictDataMapper dictDataMapper;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    public List<DictData> selectDictDataByType(String dictType) {
        Object dictDataList1 = redisUtil.get(dictType);
        if (dictDataList1 != null) {
            System.out.println("这是redis里面存储的数据" + dictDataList1);
            return (List<DictData>) dictDataList1;
        } else {
            List<DictData> dictDataList2 = dictDataMapper.selectDictDataBytype(dictType);
            System.out.println("这是mysql里面存储的数据" + dictDataList2);
            redisTemplate.opsForValue().set(dictType, dictDataList2);
            return dictDataList2;
        }
    }


    /*2.查询字典数据通过条件
    * 这个不在redis里面存储，redis里面存储的dictType对应的字典数据*/
    @Override
    public List<DictData> selectDictDataByCondition(DictData dictData) {
        List<DictData> dictDataList = dictDataMapper.selectDictDataByCondition(dictData);
        return dictDataList;
    }

    /*3.查询字典数据通过Id
    * - 注意：这个方法页面中没有直接调用的，不过写在service层是为了controller层可以调用*/
    @Override
    public DictData selectDictDataById(Long dictCode) {
        return dictDataMapper.selectDictDataById(dictCode);
    }

    /*4.查询所有字典数据信息
    * - 扩展service层方法，但是页面中没有使用*/
    @Override
    public List<DictData> selectAllDictData() {
        return dictDataMapper.selectAllDictData();
    }


    /**
     * 添加系列各种方法
     */
    /*业务层添加用户*/
    @Override
    public Boolean isAdd(DictData dictData) {
        DictData dictData1 = dictDataMapper.selectDictDataById(dictData.getDictCode());
        if (dictData1 == null) {
            int row = dictDataMapper.insertDictData(dictData);
            if (row > 0) {
                List<DictData> dictDataList = dictDataMapper.selectDictDataBytype(dictData.getDictType());
                redisUtil.set(dictData.getDictType(), dictDataList);
                return true;
            }
            return false;
        } else {
            throw new IllegalStateException("用户已经存在");
        }
    }

    @Override
    public int deleteDictDataById(Long dictCode) {
        return 0;
    }


    /**
     * 删除系列各种业务方法
     * -注意：
     * - 单个删除和单个查询的方法辅助这里的批量删除
     * - 遍历id，对每一个id删除后，就根据它对应的值更新redis
     * - 这个批量删除一般不加返回值。
     */
    /*1.批量删除字典数据信息*/
    @Override
    public void deleteDictDataByIds(Long[] dictCodes) {
        for (Long dictCode : dictCodes) {
            /*先通过id查询数据对象，用于删除后获取集合数据时候，传入dictType类型*/
            DictData dictData = dictDataMapper.selectDictDataById(dictCode);
            int row = dictDataMapper.deleteDictDataById(dictCode);
            if (row > 0) {
                List<DictData> dictDataList = dictDataMapper.selectDictDataBytype(dictData.getDictType());
                redisUtil.set(dictData.getDictType(), dictDataList);
            }
        }

    }

    /**
     * 更新系列各种方法
     */
    @Override
    public int updateDictData(DictData dictData) {
        int row = dictDataMapper.updateDictData(dictData);
        if (row > 0) {
            List<DictData> dictDataList = dictDataMapper.selectDictDataBytype(dictData.getDictType());
            redisUtil.set(dictData.getDictType(), dictDataList);
        }
        return row;
    }


}
